/** * Copyright (C) 2013 CLXY Studio. * This content is released under the (Link Goes Here) MIT License. * http://en.wikipedia.org/wiki/MIT_License */ package cn.clxy.upload; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.scheme.PlainSocketFactory; import org.apache.http.conn.scheme.Scheme; import org.apache.http.conn.scheme.SchemeRegistry; import org.apache.http.conn.ssl.SSLSocketFactory; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.ByteArrayBody; import org.apache.http.entity.mime.content.ContentBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.PoolingClientConnectionManager; import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; /** * Use http client to upload. * @author clxy */ public class ApacheHCUploader implements Uploader { private static HttpClient client = createClient(); private static final Log log = LogFactory.getLog(ApacheHCUploader.class); @Override public void upload(Part part) { String partName = part.getName(); Map<String, ContentBody> params = new HashMap<String, ContentBody>(); params.put(Config.keyFile, new ByteArrayBody(part.getContent(), partName)); post(params); log.debug(partName + " uploaded."); } @Override public void done(String fileName, long partCount) { Map<String, ContentBody> params = new HashMap<String, ContentBody>(); try { params.put(Config.keyFileName, new StringBody(fileName)); params.put(Config.keyPartCount, new StringBody(String.valueOf(partCount))); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } post(params); log.debug(fileName + " notification is done."); } private void post(Map<String, ContentBody> params) { HttpPost post = new HttpPost(Config.url); MultipartEntity entity = new MultipartEntity(); for (Entry<String, ContentBody> e : params.entrySet()) { entity.addPart(e.getKey(), e.getValue()); } post.setEntity(entity); try { HttpResponse response = client.execute(post); int statusCode = response.getStatusLine().getStatusCode(); if (statusCode != HttpStatus.SC_OK) { throw new RuntimeException("Upload failed."); } } catch (Exception e) { post.abort(); throw new RuntimeException(e); } finally { post.releaseConnection(); } } /** * The timeout should be adjusted by network condition. * @return */ private static HttpClient createClient() { SchemeRegistry schReg = new SchemeRegistry(); schReg.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); schReg.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); PoolingClientConnectionManager ccm = new PoolingClientConnectionManager(schReg); ccm.setMaxTotal(Config.maxUpload); HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 10 * 1000); HttpConnectionParams.setSoTimeout(params, Config.timeOut); return new DefaultHttpClient(ccm, params); } }